"""
用户会话管理工具模块
提供从请求中获取当前用户的功能
"""
from user.models import SysUser
from user.authentication import SysUserJWTAuthentication
from rest_framework_simplejwt.exceptions import InvalidToken, TokenError
import logging

logger = logging.getLogger(__name__)

class UserSessionManager:
    """用户会话管理器"""
    
    @staticmethod
    def get_current_user_from_request(request):
        """
        从请求中获取当前登录用户
        支持多种认证方式：
        1. JWT Token认证
        2. 请求参数中的user_id
        3. 请求头中的user_id
        """
        # 确保request对象有必要的属性
        if not hasattr(request, 'data'):
            request.data = getattr(request, 'data', {})
        if not hasattr(request, 'query_params'):
            # 对于普通Django请求，使用GET参数
            request.query_params = getattr(request, 'GET', {})
        
        # 方法1: 尝试从JWT Token获取用户
        try:
            jwt_auth = SysUserJWTAuthentication()
            # 获取请求头中的Authorization
            header = jwt_auth.get_header(request)
            if header:
                raw_token = jwt_auth.get_raw_token(header)
                if raw_token:
                    validated_token = jwt_auth.get_validated_token(raw_token)
                    user = jwt_auth.get_user(validated_token)
                    if user and hasattr(user, 'id') and user.status == 0:
                        logger.info(f"通过JWT Token获取用户: {user.username}")
                        return user
        except (InvalidToken, TokenError, AttributeError, Exception) as e:
            logger.debug(f"JWT认证失败: {e}")
            pass
        
        # 方法2: 从请求参数获取user_id
        user_id = request.data.get('current_user_id') or request.query_params.get('current_user_id')
        if user_id:
            try:
                sys_user = SysUser.objects.get(id=user_id, status=0)
                logger.info(f"通过参数获取用户: {sys_user.username}")
                return sys_user
            except SysUser.DoesNotExist:
                logger.warning(f"用户ID {user_id} 不存在或已停用")
                pass
        
        # 方法3: 从请求头获取user_id
        user_id = request.META.get('HTTP_X_USER_ID')
        if user_id:
            try:
                sys_user = SysUser.objects.get(id=user_id, status=0)
                logger.info(f"通过请求头获取用户: {sys_user.username}")
                return sys_user
            except SysUser.DoesNotExist:
                logger.warning(f"请求头用户ID {user_id} 不存在或已停用")
                pass
        
        # 如果都没有，返回None
        logger.debug("无法从请求中获取当前用户")
        return None
    
    @staticmethod
    def get_user_display_info(user):
        """
        获取用户显示信息
        """
        if not user:
            return None
        
        return {
            'id': user.id,
            'username': user.username,
            'email': user.email,
            'avatar': user.avatar,
            'display_name': user.username,
            'status': user.status,
            'is_online': True  # 简化版，实际可以基于最后活动时间判断
        }
    
    @staticmethod
    def validate_user_permission(user, target_user_id=None):
        """
        验证用户权限
        """
        if not user:
            return False, "用户未登录"
        
        if user.status != 0:
            return False, "用户账号已停用"
        
        # 如果指定了目标用户ID，验证是否为当前用户
        if target_user_id and user.id != target_user_id:
            return False, "无权限操作其他用户数据"
        
        return True, "验证通过"

# 全局用户会话管理器实例
user_session_manager = UserSessionManager()